package logicaPresentacion;

import javax.swing.*;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import logicaNegocio.Alumno;
import logicaNegocio.GestionAdministrador;
import logicaNegocio.Profesor;

public class FormularioProfesor extends JInternalFrame implements ActionListener
{
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 4566498807430129781L;
    private GestionAdministrador gAd;
    private JLabel jlbNombre,jlbApellidos,jlbDni,jlbEdad,jlbDireccion, jlbSueldo,jlbTelefono,jlbGenero;  
    private JTextField jtfNombre,jtfApellidos,jtfDni,jtfEdad,jtfDireccion,jtfSueldo,jtfTelefono;
    private JButton btnGuardar,btnCancelar;
    private Box boxVCamposVentana;   
    private JPanel panBotones;      
    private String eleccion;
    private JComboBox<String> jcbProfesores,jcbGenero;
    private ClaseAObservar observable;
    private boolean excepcion = false;
	
    
    public FormularioProfesor (GestionAdministrador gAd,String eleccion, ClaseAObservar observable)
    {
        super("Introduzca los datos personales");
        setSize(400,600);
        this.gAd = gAd;
        this.eleccion = eleccion;
        this.observable = observable;
        
        Box boxVContenidoVerticalVentana = Box.createVerticalBox();

        Box boxHNombre =  Box.createHorizontalBox();
        jlbNombre = new JLabel("Nombre ");   jtfNombre = new JTextField(15);
        boxHNombre.add(Box.createHorizontalStrut(10));
        boxHNombre.add(jlbNombre);
        boxHNombre.add(Box.createHorizontalStrut(20));
        boxHNombre.add(jtfNombre);
        JPanel panNombre =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panNombre.add(boxHNombre);

        Box boxHApellidos =  Box.createHorizontalBox();
        jlbApellidos = new JLabel("Apellidos ");   jtfApellidos = new JTextField(15);
        boxHApellidos.add(Box.createHorizontalStrut(10));
        boxHApellidos.add(jlbApellidos);
        boxHApellidos.add(Box.createHorizontalStrut(11));
        boxHApellidos.add(jtfApellidos);
        JPanel panApellidos =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panApellidos.add(boxHApellidos);

        Box boxHDni =  Box.createHorizontalBox();
        jlbDni = new JLabel("Dni (9 Numeros)");   jtfDni = new JTextField(15);
        boxHDni.add(Box.createHorizontalStrut(10));
        boxHDni.add(jlbDni);
        boxHDni.add(Box.createHorizontalStrut(11));
        boxHDni.add(jtfDni);
        JPanel panDni =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panDni.add(boxHDni);
        
        Box boxHGenero =  Box.createHorizontalBox();
        jlbGenero = new JLabel("Genero ");   jcbGenero = new JComboBox<String>();
        jcbGenero.addActionListener(this);
        jcbGenero.addItem("H");
        jcbGenero.addItem("M");
		boxHGenero.add(Box.createHorizontalStrut(10));
		boxHGenero.add(jlbGenero);
		boxHGenero.add(Box.createHorizontalStrut(10));
		boxHGenero.add(jcbGenero);
        JPanel panGenero =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panGenero.add(boxHGenero);
        
        Box boxHEdad =  Box.createHorizontalBox();
        jlbEdad = new JLabel("Edad (>18) ");   jtfEdad = new JTextField(15);
        boxHEdad.add(Box.createHorizontalStrut(10));
        boxHEdad.add(jlbEdad);
        boxHEdad.add(Box.createHorizontalStrut(40));
        boxHEdad.add(jtfEdad);
        JPanel panEdad =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panEdad.add(boxHEdad);

        Box boxDireccion =  Box.createHorizontalBox();
        jlbDireccion = new JLabel("Direccion ");   jtfDireccion = new JTextField(15);
        boxDireccion.add(Box.createHorizontalStrut(10));
        boxDireccion.add(jlbDireccion);
        boxDireccion.add(Box.createHorizontalStrut(40));
        boxDireccion.add(jtfDireccion);
        JPanel panDireccion =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panDireccion.add(boxDireccion);
        
        Box boxSueldo =  Box.createHorizontalBox();
        jlbSueldo = new JLabel("Sueldo (Entre 2500 y 8000) ");   jtfSueldo = new JTextField(15);
        boxSueldo.add(Box.createHorizontalStrut(10));
        boxSueldo.add(jlbSueldo);
        boxSueldo.add(Box.createHorizontalStrut(40));
        boxSueldo.add(jtfSueldo);
        JPanel panSueldo =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panSueldo.add(boxSueldo);
        
        Box boxTelefono =  Box.createHorizontalBox();
        jlbTelefono = new JLabel("Telefono (9 N�meros) ");   jtfTelefono = new JTextField(15);
        boxTelefono.add(Box.createHorizontalStrut(10));
        boxTelefono.add(jlbTelefono);
        boxTelefono.add(Box.createHorizontalStrut(40));
        boxTelefono.add(jtfTelefono);
        JPanel panTelefono =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panTelefono.add(boxTelefono);
        
        boxVCamposVentana = Box.createVerticalBox();
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panNombre);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panApellidos);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panDni);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panGenero);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panEdad);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panDireccion);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panSueldo);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panTelefono);

        if (eleccion == "Actualizar")
        {
        	Map <String,Profesor> profesores = gAd.getProfesores();
        	Box boxHProfesores =  Box.createHorizontalBox();
            JLabel jlbProfesores;
            
            jlbProfesores = new JLabel("Elige el profesor ");   
            jcbProfesores = new JComboBox<String>();
            jcbProfesores.addActionListener(this);
            Iterator<Entry<String, Profesor>> it = profesores.entrySet().iterator();
    	
    		while (it.hasNext()) 
    	    {
    	    Entry<String, Profesor> e = it.next();
    	    Profesor p = (Profesor) profesores.get (e.getKey());
            String Nombre = p.getNombre();
            jcbProfesores.addItem(Nombre);
            }
    		
    		boxHProfesores.add(Box.createHorizontalStrut(10));
    		boxHProfesores.add(jlbProfesores);
    		boxHProfesores.add(Box.createHorizontalStrut(40));
    		boxHProfesores.add(jcbProfesores);
            JPanel panProfesores =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
            panProfesores.add(boxHProfesores);
            
            boxVCamposVentana.add(Box.createVerticalStrut(10));
            boxVCamposVentana.add(panProfesores);
        }
        Box boxHBotones = Box.createHorizontalBox();

        btnGuardar = new JButton("Guardar");
        btnCancelar = new JButton("Cancelar");
        btnGuardar.addActionListener(this);
        btnCancelar.addActionListener(this);
        
        boxHBotones.add(btnGuardar);
        boxHBotones.add(Box.createHorizontalStrut(20));
        boxHBotones.add(btnCancelar);
        boxHBotones.add(Box.createHorizontalStrut(30));

        panBotones =  new JPanel(new FlowLayout(FlowLayout.RIGHT) );
        panBotones.add(boxHBotones);
        boxVContenidoVerticalVentana.add(Box.createVerticalStrut(30));
        boxVContenidoVerticalVentana.add(boxVCamposVentana);
        boxVContenidoVerticalVentana.add(Box.createVerticalStrut(20));
        boxVContenidoVerticalVentana.add(panBotones);
        
        this.getContentPane().add(boxVContenidoVerticalVentana);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);  
    }
    
    public void actionPerformed(ActionEvent e)
    {

    	if (e.getSource() instanceof JButton) 
		{
			JButton btnPulsado=(JButton)e.getSource();
	        
			if (btnPulsado==btnGuardar) 
			{
				if (("".equals(jtfNombre.getText()))||("".equals(jtfApellidos.getText()))||("".equals(jtfDni.getText()))||("".equals(jtfEdad.getText()))||("".equals(jtfDireccion.getText()))||("".equals(jtfSueldo.getText()))||("".equals(jtfTelefono.getText())))
	            {
					JOptionPane.showMessageDialog(this,"Rellene todos los campos del formulario","Advertencia",JOptionPane.WARNING_MESSAGE);
	            }
				else
				{
					try
                    {
                    	tamanoDni(jtfDni.getText());
                    }
                    catch(ExcepcionTamano edni)
                    {
                    	JOptionPane.showMessageDialog(this,"Error de formato en el DNI,deben ser 9 caracteres","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    try
                    {
                    	int telefono = Integer.parseInt(jtfTelefono.getText());
                    	tamanoTelefono(jtfTelefono.getText());
                    }
                    catch(ExcepcionTamano eftlf)
                    {
                    	JOptionPane.showMessageDialog(this,"Error de formato en el telefono, deben ser 9 numeros","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    catch(NumberFormatException nfe)
                    {
                
                    	JOptionPane.showMessageDialog(this,"Error de formato en el telefono, deben ser numeros","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    try
                    {
                    	tamanoEdad(jtfEdad.getText());
                    }
                    catch(ExcepcionTamano etm)
                    {
                    	JOptionPane.showMessageDialog(this,"Error de formato en la edad, debe ser minimo 18","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    catch(NumberFormatException nfe)
                    {
                    	JOptionPane.showMessageDialog(this,"Error de formato en la edad, debe ser un numero","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    try
                    {
                    	int sueldo = Integer.parseInt(jtfSueldo.getText());
                    	tamanoSueldo(jtfSueldo.getText());
                    }
                    catch(ExcepcionTamano esuel)
                    {
                    	JOptionPane.showMessageDialog(this,"Error de formato en el sueldo, debe estar entre 2.500 y 8.000 euros","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    catch(NumberFormatException nfe)
                    {
                
                    	JOptionPane.showMessageDialog(this,"Error de formato en el sueldo, debe ser un numero","Error",JOptionPane.ERROR_MESSAGE);
                    	excepcion=true;
                    }
                    if(excepcion ==false)
                    {
                    	if (eleccion == "Anadir")
						{           
                    		if(comprobarExiste() == false)
    						{
                    			gAd.anadirProfesor(jtfNombre.getText(), jtfApellidos.getText(), jtfDireccion.getText(),jtfTelefono.getText(), jtfDni.getText(),  jtfSueldo.getText(),jtfEdad.getText(),jcbGenero.getSelectedItem());
    							observable.setTabla();
    							dispose();
    						}
	    					else
	    					{
	                        	JOptionPane.showMessageDialog(this,"El Profesor que desea insertar tiene un DNI ya existente","Error",JOptionPane.ERROR_MESSAGE);
	    					}
							
						}
                	if (eleccion == "Actualizar")
						{
	                		gAd.actualizarProfesor(jtfNombre.getText(), jtfApellidos.getText(), jtfDireccion.getText(),jtfTelefono.getText(), jtfDni.getText(),  jtfSueldo.getText(),jtfEdad.getText(),jcbProfesores.getSelectedIndex(),jcbGenero.getSelectedItem());
	                		observable.setTabla();
	                		dispose();
						}       	
                    }
                    else
                    {
                    	excepcion = false;
                    } 
				}   
			}
			else if (btnPulsado==btnCancelar) 
			{
				dispose();
			}
		}
    }   
    public void tamanoDni(String dni)throws ExcepcionTamano
    {
    	if(dni.length()!=9)
    	{
    		throw new ExcepcionTamano();
    	}
    }
    public void tamanoEdad(String edad)throws ExcepcionTamano
    {
    	int num = Integer.parseInt(edad);
    	if(num<18)
    	{
    		throw new ExcepcionTamano();
    	}
    }
    public void tamanoTelefono(String telefono)throws ExcepcionTamano
    {
    	if(telefono.length()!=9)
    	{
    		throw new ExcepcionTamano();
    	}
    }
    public void tamanoSueldo(String sueldo)throws ExcepcionTamano
    {
    	int num = Integer.parseInt(sueldo);
    	if((num<2500)||(num>8000))
    	{
    		throw new ExcepcionTamano();
    	}
    }
    boolean comprobarExiste()
    {
    	boolean comprobacion = false;
    	Map<String,Profesor> Profesores = gAd.getProfesores();
    	if(Profesores.size()!=0)
    	{
    		for (Map.Entry<String, Profesor> entry : Profesores.entrySet())
    		{
    			Profesor P = Profesores.get(entry.getKey());
    			if(P.getDni().equals(jtfDni.getText()))
    			{
    				comprobacion = true;
    			}
    		}
    	}
    	return comprobacion;
    }
}
